package volatileTest;

/**
 * @program: javase
 * @description: 单例模式，指令重排
 * @author: lld
 * @create: 2021-04-22 22:22
 **/
public class Singleton {
//    特点：私有构造器
    private Singleton(){
        System.out.println(Thread.currentThread().getName()+"ok");
    }
    private static volatile Singleton singleton = null;

    //双重检测锁DCL
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                    //此操作不是原子性
//                    1.分配内存空间
//                    2.执行构造器
//                    3.指向这个空间
//                    指向对象可能为空
//                    必须加volatile,防止指令重排引发多线程安全问题
                }
            }
        }
        return singleton;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                Singleton.getSingleton();
            }).start();
        }
    }
}
